﻿using Ext.Net;
using Ext.Net.MVC;
using PcaCaja.BOL;
using PcaCaja.DAL;
using PcaCore.DAL;
using PcaCore.DAL.Log;
using PcaWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;

namespace PcaWeb.Areas.Parqueos.Controllers
{
    [DirectController(AreaName = "Parqueos")]
    public class MovimientoUsuarioController : ControllerUser
    {
        public IAccountMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }
        
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetList(StoreRequestParameters parameters, long? liquidacionId,string detalle)
        {
            int total;
            List<oVwMovimiento> grupos = dMovimiento.GetList(parameters.Start,
                                                             parameters.Limit,
                                                             out total,
                                                             dSesion.GetEmpresaId(),
                                                             dSesion.GetOficinaId(),
                                                             Convert.ToInt64(liquidacionId),
                                                             detalle);
            return this.Store(grupos, total);
        }

        public ActionResult FrmRegistrar(long? liquidacionId)
        {
            try
            {
                oLiquidacion liquidacion = dLiquidacion.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());
                if (liquidacion.cerrado)
                    throw new Exception("La liquidacion se encuentra cerrada y no se puede modificar");

                return new Ext.Net.MVC.PartialViewResult
                {
                    ViewName = "FrmRegistrar"
                };
            }
            catch(Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult CerrarLiquidacion(long? liquidacionId, string claveUsuario)
        {
            try
            {
                oLiquidacion liquidacion = dLiquidacion.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());
                if (liquidacion.cerrado)
                    throw new Exception("La liquidacion se encuentra cerrada y no se puede modificar");
                
                if (!MembershipService.ValidateUser(Membership.GetUser().UserName, claveUsuario))
                {
                    return Json(new { success = false, msg = "La clave ingresada no es correcta..." });
                }

                dLiquidacion.Cerrar(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());
                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult FrmCerrarLiquidacion(long? liquidacionId)
        {
            try
            {
                oLiquidacion liquidacion = dLiquidacion.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());
                if (liquidacion.cerrado)
                    throw new Exception("La liquidacion ya se encuentra cerrada");

                //Calculamos la liquidacion
                dResumenLiquidacion.Calcular(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());

                //Consultamos el resumen de liquidacion
                List<oVwResumenLiquidacion> resumen = dResumenLiquidacion.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(liquidacionId), dSesion.GetUsuarioId());

                return new Ext.Net.MVC.PartialViewResult
                {
                    ViewName = "FrmCerrarLiquidacion",
                    Model = resumen
                };
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        private Ext.Net.MVC.PartialViewResult FrmEditar(oVwMovimiento movimiento)
        {
            //No se permiten eliminar el saldo inicial
            if (movimiento.grupo_movimiento_id == 1500453386)
                ViewBag.readOnlyDetalle = true;
            else
                ViewBag.readOnlyDetalle = false;

            return new Ext.Net.MVC.PartialViewResult
            {
                ViewName = "FrmEditar",
                Model = movimiento,
                ViewData = ViewData
            };
        }

        private ActionResult ConfirmarEliminar(oVwMovimiento movimiento)
        {
            try
            {
                MessageBoxConfig config = new MessageBoxConfig();
                config.Title = "Confirmacion";
                config.Message = string.Format("Eliminar movimiento fecha:\"{0}\" grupo: \"{1}\"  monto\"{2} {3}\"",
                                               ((DateTime)movimiento.fecha).ToShortDateString(),
                                               movimiento.nombre_grupo_movimiento,
                                               movimiento.siglas_moneda,
                                               movimiento.monto.ToString("##,###.00"));
                config.Closable = false;
                config.Icon = MessageBox.Icon.QUESTION;
                config.Buttons = MessageBox.Button.YESNO;
                config.MessageBoxButtonsConfig = new MessageBoxButtonsConfig
                {
                    Yes = new MessageBoxButtonConfig { Handler = string.Format("MovimientoUsuario.Parqueos.Eliminar(\"{0}\")", movimiento.movimiento_id), Text = "Si" },
                    No = new MessageBoxButtonConfig { Text = "No" }
                };

                X.Msg.Show(config);
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [DirectMethod(Namespace = "MovimientoUsuario")]
        public ActionResult Eliminar(long? movimientoId)
        {
            try
            {
                oVwMovimiento movimiento = dMovimiento.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(movimientoId));

                //No se permiten eliminar documentos registrados por cobros parqueo
                if (movimiento.grupo_movimiento_id == 1241588087)
                    return Json(new { success = false, msg = "No se permiten eliminar cobros parqueo" });

                //No se permiten eliminar el saldo inicial
                if (movimiento.grupo_movimiento_id == 1500453386)
                    return Json(new { success = false, msg = "No se permiten eliminar el saldo inicial" });

                dMovimiento.Delete(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(movimientoId));
                this.GetCmp<Store>("storeMovimientoUsuario").LoadProxy();
                return this.Direct();
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult Registrar(long? liquidacionId,string tipo_movimiento_id,string  detalle,string moneda_id,decimal? monto)
        {

            try
            {
                PcaParqueos.DAL.dMovimiento.Insert(dSesion.GetEmpresaId(),
                                                   dSesion.GetOficinaId(),
                                                   dSesion.GetId(),
                                                   tipo_movimiento_id,
                                                   Convert.ToInt64(liquidacionId),
                                                   dSesion.GetUsuarioId(),
                                                   detalle,
                                                   moneda_id,
                                                   Convert.ToDecimal(monto)
                                                   );
                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult Actualizar(long? movimiento_id, string tipo_movimiento_id, string detalle, string moneda_id, decimal? monto)
        {
            try
            {
                PcaParqueos.DAL.dMovimiento.Update(dSesion.GetEmpresaId(),
                                                   dSesion.GetOficinaId(),
                                                   Convert.ToInt64(movimiento_id),
                                                   dSesion.GetId(),
                                                   tipo_movimiento_id,
                                                   detalle,
                                                   moneda_id,
                                                   Convert.ToInt64(monto));  
                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult RunCommandGrid(string commandName, long? movimientoId)
        {
            oVwMovimiento movimiento = dMovimiento.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(movimientoId));

            if (movimiento == null)
                return Json(new { success = false, msg = "El registro ya no existe en la base de datos, posiblemente fue eliminado por otro usuario" });

            //No se permiten editar documentos que pertenecen a determinados grupos(por automatizar)
            if (movimiento.grupo_movimiento_id == 1241588087)
                return Json(new { success = false, msg = "No se permiten modificar cobros parqueo" });

            switch (commandName)
            {
                case "cmdEditar":
                    return FrmEditar(movimiento);
                case "cmdEliminar":
                    //No se permiten eliminar el saldo inicial
                    if (movimiento.grupo_movimiento_id == 1500453386)
                        return Json(new { success = false, msg = "No se permiten eliminar el saldo inicial" });

                    return ConfirmarEliminar(movimiento);
                default:
                    return Json(new { success = false, msg = String.Format("\"{0}\" no es un comando valido", commandName) });
            }
        }
    }
}